home *** CD-ROM | disk | FTP | other *** search
- head 1.10;
- branch ;
- access ;
- symbols ;
- locks eklee:1.10; strict;
- comment @ * @;
-
-
- 1.10
- date 91.12.16.19.29.55; author voelker; state Exp;
- branches ;
- next 1.9;
-
- 1.9
- date 91.09.14.15.17.12; author mendel; state Exp;
- branches ;
- next 1.8;
-
- 1.8
- date 90.03.16.17.41.15; author jhh; state Exp;
- branches ;
- next 1.7;
-
- 1.7
- date 90.01.31.13.59.59; author shirriff; state Exp;
- branches ;
- next 1.6;
-
- 1.6
- date 89.10.02.23.17.57; author jhh; state Exp;
- branches ;
- next 1.5;
-
- 1.5
- date 89.09.25.12.32.35; author jhh; state Exp;
- branches ;
- next 1.4;
-
- 1.4
- date 88.12.05.14.23.13; author nelson; state Exp;
- branches ;
- next 1.3;
-
- 1.3
- date 88.10.27.15.30.47; author nelson; state Exp;
- branches ;
- next 1.2;
-
- 1.2
- date 88.07.19.11.54.30; author douglis; state Exp;
- branches ;
- next 1.1;
-
- 1.1
- date 88.06.02.12.54.09; author brent; state Exp;
- branches ;
- next ;
-
-
- desc
- @Sector and block aligned I/O to a raw disk.
- @
-
-
- 1.10
- log
- @removed printf()s that reported short reads and writes it
- Disk_SectorRead/Write...let callers decide to report the error
-
- If the procedures return an error, then the streams can be tested
- for EOF or the errno can be checked to see if there was a system
- call error or a short read/write
-
- @
- text
- @/*
- * diskIO.c --
- *
- * Routines to do I/O to a raw disk.
- *
- * Copyright (C) 1987 Regents of the University of California
- * All rights reserved.
- * Permission to use, copy, modify, and distribute this
- * software and its documentation for any purpose and without
- * fee is hereby granted, provided that the above copyright
- * notice appear in all copies. The University of California
- * makes no representations about the suitability of this
- * software for any purpose. It is provided "as is" without
- * express or implied warranty.
- */
-
- #ifndef lint
- static char rcsid[] = "$Header: /sprite/src/lib/disk/RCS/diskIO.c,v 1.9 91/09/14 15:17:12 mendel Exp Locker: voelker $ SPRITE (Berkeley)";
- #endif not lint
-
- #include "disk.h"
- #include <stdio.h>
- #include <errno.h>
- #include <sys/file.h>
-
-
- /*
- *----------------------------------------------------------------------
- *
- * Disk_SectorRead --
- * Read sectors from the disk file at a specified offset. This combines
- * an Ioc_Reposition with the read.
- *
- * Results:
- * 0 if could read the sector, -1 if could not. If couldn't read
- * the disk then the error is stored in errno.
- *
- * Side effects:
- * Reposition the disk file's stream pointer and *buffer filled
- * with data from the disk.
- *
- *----------------------------------------------------------------------
- */
- int
- Disk_SectorRead(openFileID, firstSector, numSectors, buffer)
- int openFileID; /* Handle on raw disk */
- int firstSector; /* First sector to read */
- int numSectors; /* The number of sectors to read */
- Address buffer; /* The buffer to read into */
- {
- int amountRead;
-
- if (lseek(openFileID, (long) (firstSector * DEV_BYTES_PER_SECTOR), L_SET)
- < (long) 0) {
- perror("Disk_SectorRead: lseek failed");
- return(-1);
- }
- amountRead = read(openFileID, buffer, DEV_BYTES_PER_SECTOR * numSectors);
- if (amountRead < 0) {
- perror("Disk_SectorRead: read failed");
- return(-1);
- } else if (amountRead != DEV_BYTES_PER_SECTOR * numSectors) {
- /*
- * short read or EOF
- */
- errno = 0;
- return(-1);
- }
- return(0);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Disk_SectorWrite --
- * Write sectors to the disk file at a specified offset. This combines
- * an Ioc_Reposition with the write.
- *
- * Results:
- * 0 if could write the disk, -1 if could not. If couldn't read the
- * disk then the error number is stored in errno.
- *
- * Side effects:
- * The write.
- *
- *----------------------------------------------------------------------
- */
- int
- Disk_SectorWrite(openFileID, firstSector, numSectors, buffer)
- int openFileID; /* Handle on raw disk */
- int firstSector; /* First sector to read */
- int numSectors; /* The number of sectors to read */
- Address buffer; /* The buffer to read into */
- {
- int amountWritten;
-
- if (lseek(openFileID, (long) (firstSector * DEV_BYTES_PER_SECTOR), L_SET)
- == (long) -1) {
- perror("Disk_SectorWrite: lseek failed");
- fprintf(stderr, "fd = %d, offset = %ld, whence= %d\n",
- openFileID, firstSector * DEV_BYTES_PER_SECTOR, L_SET);
- return(-1);
- }
- amountWritten = write(openFileID, buffer,
- DEV_BYTES_PER_SECTOR * numSectors);
- if (amountWritten < 0) {
- perror("Disk_SectorWrite: write failed");
- fprintf(stderr, "fd = %d, buffer= 0x%08x, cnt = %d firstSector = %d\n",
- openFileID, buffer, DEV_BYTES_PER_SECTOR * numSectors,
- firstSector);
-
- return(-1);
- } else if (amountWritten != DEV_BYTES_PER_SECTOR * numSectors) {
- /*
- * short write or EOF
- */
- errno = 0;
- return(-1);
- }
- return(0);
- }
-
-
- /*
- *----------------------------------------------------------------------
- *
- * Disk_BlockRead --
- * Read blocks to the disk file at a specified block offset.
- * This has to use the disk geometry information to figure out
- * what disk sectors correspond to the block.
- *
- * Results:
- * 0 if could read the block, -1 if could not. If couldn't read the block
- * the the error is stored in errno.
- *
- * Side effects:
- * *buffer is filled with the data from the disk.
- *
- *----------------------------------------------------------------------
- */
- int
- Disk_BlockRead(openFileID, headerPtr, firstBlock, numBlocks, buffer)
- int openFileID; /* Handle on raw disk */
- Ofs_DomainHeader *headerPtr; /* Domain header with geometry
- * information */
- int firstBlock; /* First block to read */
- int numBlocks; /* The number of blocks to read */
- Address buffer; /* The buffer to read into */
- {
- register Ofs_Geometry *geoPtr;
- register int blockIndex;
- register int cylinder;
- register int rotationalSet;
- register int blockNumber;
- int firstSector;
-
- geoPtr = &headerPtr->geometry;
- for (blockIndex = 0 ; blockIndex < numBlocks ; blockIndex++) {
- blockNumber = firstBlock + blockIndex;
- cylinder = blockNumber / geoPtr->blocksPerCylinder;
- if (geoPtr->rotSetsPerCyl > 0) {
- /*
- * Original mapping scheme using rotational sets.
- */
- blockNumber -= cylinder * geoPtr->blocksPerCylinder;
- rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
- blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
-
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads *
- cylinder +
- geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet *
- rotationalSet + geoPtr->blockOffset[blockNumber];
- } else if (geoPtr->rotSetsPerCyl == OFS_SCSI_MAPPING){
- /*
- * New mapping for scsi devices.
- */
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads *
- cylinder +
- blockNumber * DISK_SECTORS_PER_BLOCK -
- cylinder *
- geoPtr->blocksPerCylinder * DISK_SECTORS_PER_BLOCK;
- } else {
- return -1;
- }
- if (Disk_SectorRead(openFileID, firstSector,
- DISK_SECTORS_PER_BLOCK, buffer) < 0) {
- return(-1);
- }
- buffer += FS_BLOCK_SIZE;
- }
- return(0);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Disk_BadBlockRead --
- * Read 1 block a sector at a time, returning a bitmap corresponding
- * to the blocks that were read successfully.
- * This has to use the disk geometry information to figure out
- * what disk sectors correspond to the block.
- *
- * Results:
- * The bitmask of valid sectors is returned.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
- int
- Disk_BadBlockRead(openFileID, headerPtr, blockNumber, buffer)
- int openFileID; /* Handle on raw disk */
- Ofs_DomainHeader *headerPtr;/* Domain header with geometry information */
- int blockNumber; /* Block to read */
- Address buffer; /* The buffer to read into */
- {
- ReturnStatus status;
- register Ofs_Geometry *geoPtr;
- register int sectorIndex;
- register int cylinder;
- register int rotationalSet;
- int firstSector;
- int valid = 0; /* Assumes <= 32 sectors/block */
-
- geoPtr = &headerPtr->geometry;
- cylinder = blockNumber / geoPtr->blocksPerCylinder;
- blockNumber -= cylinder * geoPtr->blocksPerCylinder;
- rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
- blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
-
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads * cylinder +
- geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet * rotationalSet +
- geoPtr->blockOffset[blockNumber];
- for (sectorIndex = 0; sectorIndex < DISK_SECTORS_PER_BLOCK; sectorIndex++) {
- if (Disk_SectorRead(openFileID, firstSector + sectorIndex,
- 1, buffer) >= 0) {
- valid |= (1 << sectorIndex);
- }
- buffer += DEV_BYTES_PER_SECTOR;
- }
- return(valid);
- }
-
- /*
- *----------------------------------------------------------------------
- *
- * Disk_BlockWrite --
- * Write blocks to the disk file at a specified block offset.
- * This has to use the disk geometry information to figure out
- * what disk sectors correspond to the block.
- * Write blocks individually if a hard error occurs during the write
- * of the entire block.
- *
- * Note: ignores the error condition otherwise, so if two blocks
- * are to be written, everything but unwritable sectors will be written
- * and the error for the unwritable sector(s) would be returned.
- *
- * Results:
- * 0 if could write the block, -1 if could not. If couldn't write the
- * block then the error is stored in errno.
- *
- * Side effects:
- * None.
- *
- *----------------------------------------------------------------------
- */
- int
- Disk_BlockWrite(openFileID, headerPtr, firstBlock, numBlocks, buffer)
- int openFileID; /* Handle on raw disk */
- Ofs_DomainHeader *headerPtr; /* Domain header with geometry
- * information */
- int firstBlock; /* First block to read */
- int numBlocks; /* The number of blocks to read */
- Address buffer; /* The buffer to read into */
- {
- register Ofs_Geometry *geoPtr;
- register int blockIndex; /* Loop counter */
- register int cylinder; /* Cylinder within domain */
- register int rotationalSet; /* Rotational Set within cylinder */
- register int blockNumber; /* Block number within rotational set */
- int firstSector;
-
- geoPtr = &headerPtr->geometry;
- for (blockIndex = 0 ; blockIndex < numBlocks ; blockIndex++) {
- blockNumber = firstBlock + blockIndex;
- cylinder = blockNumber / geoPtr->blocksPerCylinder;
- if (geoPtr->rotSetsPerCyl > 0) {
- /*
- * Original mapping scheme using rotational sets.
- */
- blockNumber -= cylinder * geoPtr->blocksPerCylinder;
- rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
- blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
-
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads *
- cylinder +
- geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet *
- rotationalSet + geoPtr->blockOffset[blockNumber];
- } else if (geoPtr->rotSetsPerCyl == OFS_SCSI_MAPPING){
- /*
- * New mapping for scsi devices.
- */
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads *
- cylinder +
- blockNumber * DISK_SECTORS_PER_BLOCK -
- cylinder *
- geoPtr->blocksPerCylinder * DISK_SECTORS_PER_BLOCK;
- } else {
- return -1;
- }
- if (Disk_SectorWrite(openFileID, firstSector,
- DISK_SECTORS_PER_BLOCK, buffer) < 0) {
- return(-1);
- }
- buffer += FS_BLOCK_SIZE;
- }
- return(0);
- }
-
- @
-
-
- 1.9
- log
- @Changes to reflect the old Sprite file system name being OFS and the
- addition of LFS.
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: /sprite/src/lib/c/disk/RCS/diskIO.c,v 1.8 90/03/16 17:41:15 jhh Exp Locker: mendel $ SPRITE (Berkeley)";
- d63 3
- a65 2
- fprintf(stderr, "Disk_SectorRead: short read, %d sectors, not %d\n",
- amountRead / DEV_BYTES_PER_SECTOR, numSectors);
- d114 3
- a116 2
- fprintf(stderr, "Disk_SectorWrite: short write, %d sectors, not %d\n",
- amountWritten / DEV_BYTES_PER_SECTOR, numSectors);
- @
-
-
- 1.8
- log
- @replaced DiskInfo abstraction with Disk_Label
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: /sprite/src/lib/c/disk/RCS/diskIO.c,v 1.7 90/01/31 13:59:59 shirriff Exp Locker: jhh $ SPRITE (Berkeley)";
- d142 1
- a142 1
- Fsdm_DomainHeader *headerPtr; /* Domain header with geometry
- d148 1
- a148 1
- register Fsdm_Geometry *geoPtr;
- d171 1
- a171 1
- } else if (geoPtr->rotSetsPerCyl == FSDM_SCSI_MAPPING){
- d212 1
- a212 1
- Fsdm_DomainHeader *headerPtr;/* Domain header with geometry information */
- d217 1
- a217 1
- register Fsdm_Geometry *geoPtr;
- d269 1
- a269 1
- Fsdm_DomainHeader *headerPtr; /* Domain header with geometry
- d275 1
- a275 1
- register Fsdm_Geometry *geoPtr;
- d298 1
- a298 1
- } else if (geoPtr->rotSetsPerCyl == FSDM_SCSI_MAPPING){
- @
-
-
- 1.7
- log
- @Copied change in fsmake to this directory.
- This change probably isn't important.
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: /sprite/src/admin/fsinstall/RCS/diskIO.c,v 1.2 89/12/13 14:07:06 rab Exp $ SPRITE (Berkeley)";
- d21 1
- a21 1
- #include "diskUtils.h"
- d53 2
- a54 1
- if (lseek(openFileID, firstSector * DEV_BYTES_PER_SECTOR, L_SET) < 0) {
- d96 2
- a97 1
- if (lseek(openFileID, firstSector * DEV_BYTES_PER_SECTOR, L_SET) == -1) {
- @
-
-
- 1.6
- log
- @new scsi disk mapping
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: /sprite/src/lib/c/disk/RCS/diskIO.c,v 1.5 89/09/25 12:32:35 jhh Exp Locker: jhh $ SPRITE (Berkeley)";
- d95 1
- a95 1
- if (lseek(openFileID, firstSector * DEV_BYTES_PER_SECTOR, L_SET) < 0) {
- d97 2
- d105 4
- @
-
-
- 1.5
- log
- @Conforms to new fs module structure
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: /sprite/src/lib/c/disk/RCS/diskIO.c,v 1.4 88/12/05 14:23:13 nelson Exp Locker: jhh $ SPRITE (Berkeley)";
- d151 24
- a174 9
- blockNumber -= cylinder * geoPtr->blocksPerCylinder;
- rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
- blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
-
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads *
- cylinder +
- geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet *
- rotationalSet +
- geoPtr->blockOffset[blockNumber];
- d278 24
- a301 9
- blockNumber -= cylinder * geoPtr->blocksPerCylinder;
- rotationalSet = blockNumber / geoPtr->blocksPerRotSet;
- blockNumber -= rotationalSet * geoPtr->blocksPerRotSet;
-
- firstSector = geoPtr->sectorsPerTrack * geoPtr->numHeads *
- cylinder +
- geoPtr->sectorsPerTrack * geoPtr->tracksPerRotSet *
- rotationalSet +
- geoPtr->blockOffset[blockNumber];
- @
-
-
- 1.4
- log
- @Fixed error in call to lseek in Disk_SectorWrite.
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: /sprite/src/lib/c/disk/RCS/diskIO.c,v 1.3 88/10/27 15:30:47 nelson Exp $ SPRITE (Berkeley)";
- d134 1
- a134 1
- FsDomainHeader *headerPtr; /* Domain header with geometry
- d140 1
- a140 1
- register FsGeometry *geoPtr;
- d189 1
- a189 1
- FsDomainHeader *headerPtr;/* Domain header with geometry information */
- d194 1
- a194 1
- register FsGeometry *geoPtr;
- d246 1
- a246 1
- FsDomainHeader *headerPtr; /* Domain header with geometry
- d252 1
- a252 1
- register FsGeometry *geoPtr;
- @
-
-
- 1.3
- log
- @Ported to the new C library.
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: diskIO.c,v 1.2 88/07/19 11:54:30 douglis Exp $ SPRITE (Berkeley)";
- d95 1
- a95 1
- if (lseek(openFileID, firstSector * DEV_BYTES_PER_SECTOR, L_SET < 0)) {
- @
-
-
- 1.2
- log
- @added Disk_BadBlockRead, to read a sector at a time and return a mask
- of the blocks read successfully, and changed BlockWrite to try to
- write individual sectors if it gets an error writing the whole thing.
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: diskIO.c,v 1.1 88/06/02 12:54:09 brent Exp $ SPRITE (Berkeley)";
- a20 2
- #include "sprite.h"
- #include "io.h"
- d22 3
- a24 2
- #include "mem.h"
- #include "byte.h"
- d30 1
- a30 1
- * SectorRead --
- d35 2
- a36 1
- * The buffer is filled in with read data.
- d39 2
- a40 1
- * Reposition the disk file's stream pointer.
- d44 6
- a49 6
- ReturnStatus
- SectorRead(openFileID, firstSector, numSectors, buffer)
- int openFileID; /* Handle on raw disk */
- int firstSector; /* First sector to read */
- int numSectors; /* The number of sectors to read */
- Address buffer; /* The buffer to read into */
- a50 2
- ReturnStatus status;
- int oldOffset; /* Returned from Ioc_Reposition */
- d53 3
- a55 6
- status = Ioc_Reposition(openFileID, IOC_BASE_ZERO,
- firstSector * DEV_BYTES_PER_SECTOR, &oldOffset);
- if (status != SUCCESS) {
- Io_PrintStream(io_StdErr, "SectorRead: Ioc_Reposition failed <%x>\n",
- status);
- return(status);
- d57 4
- a60 5
- status = Fs_Read(openFileID, DEV_BYTES_PER_SECTOR * numSectors, buffer,
- &amountRead);
- if (status != SUCCESS) {
- Io_PrintStream(io_StdErr, "SectorRead: Fs_Read failed <%x>\n", status);
- return(status);
- d62 4
- a65 3
- Io_PrintStream(io_StdErr,
- "SectorRead: short read, %d sectors, not %d\n",
- amountRead/DEV_BYTES_PER_SECTOR, numSectors);
- d67 1
- a67 1
- return(SUCCESS);
- d73 1
- a73 1
- * SectorWrite --
- d78 2
- a79 1
- * The return code from the write.
- d86 6
- a91 6
- ReturnStatus
- SectorWrite(openFileID, firstSector, numSectors, buffer)
- int openFileID; /* Handle on raw disk */
- int firstSector; /* First sector to read */
- int numSectors; /* The number of sectors to read */
- Address buffer; /* The buffer to read into */
- a92 2
- ReturnStatus status;
- int oldOffset; /* Returned from Ioc_Reposition */
- d95 3
- a97 6
- status = Ioc_Reposition(openFileID, IOC_BASE_ZERO,
- firstSector * DEV_BYTES_PER_SECTOR, &oldOffset);
- if (status != SUCCESS) {
- Io_PrintStream(io_StdErr, "SectorWrite: Ioc_Reposition failed <%x>\n",
- status);
- return(status);
- d99 5
- a103 6
- status = Fs_Write(openFileID, DEV_BYTES_PER_SECTOR * numSectors, buffer,
- &amountWritten);
- if (status != SUCCESS) {
- Io_PrintStream(io_StdErr,
- "SectorWrite: Fs_Write failed <%x>\n", status);
- return(status);
- d105 4
- a108 3
- Io_PrintStream(io_StdErr,
- "SectorWrite: short write, %d sectors, not %d\n",
- amountWritten/DEV_BYTES_PER_SECTOR, numSectors);
- d110 1
- a110 1
- return(SUCCESS);
- d112 1
- d117 1
- a117 1
- * BlockRead --
- d123 2
- a124 1
- * The return code from the read.
- d127 1
- a127 1
- * None.
- d131 8
- a138 7
- ReturnStatus
- BlockRead(openFileID, headerPtr, firstBlock, numBlocks, buffer)
- int openFileID; /* Handle on raw disk */
- FsDomainHeader *headerPtr;/* Domain header with geometry information */
- int firstBlock; /* First block to read */
- int numBlocks; /* The number of blocks to read */
- Address buffer; /* The buffer to read into */
- a139 1
- ReturnStatus status;
- d160 3
- a162 4
- status = SectorRead(openFileID, firstSector,
- SECTORS_PER_BLOCK, buffer);
- if (status != SUCCESS) {
- return(status);
- d166 1
- a166 1
- return(SUCCESS);
- a177 3
- * Note: this follows what should be the naming convention for all
- * the routines in this file...
- *
- d210 3
- a212 3
- for (sectorIndex = 0; sectorIndex < SECTORS_PER_BLOCK; sectorIndex++) {
- status = SectorRead(openFileID, firstSector + sectorIndex, 1, buffer);
- if (status == SUCCESS) {
- d223 1
- a223 1
- * BlockWrite --
- d235 2
- a236 1
- * The return code from the write.
- d239 1
- a239 1
- * The write.
- d243 8
- a250 7
- ReturnStatus
- BlockWrite(openFileID, headerPtr, firstBlock, numBlocks, buffer)
- int openFileID; /* Handle on raw disk */
- FsDomainHeader *headerPtr;/* Domain header with geometry information */
- int firstBlock; /* First block to read */
- int numBlocks; /* The number of blocks to read */
- Address buffer; /* The buffer to read into */
- a251 2
- ReturnStatus status;
- ReturnStatus realStatus = SUCCESS;
- d272 3
- a274 18
- status = SectorWrite(openFileID, firstSector,
- SECTORS_PER_BLOCK, buffer);
- if (status != SUCCESS) {
- /*
- * Try to write each sector individually.
- */
- int sector;
-
- for (sector = 0; sector < SECTORS_PER_BLOCK; sector++) {
- status = SectorWrite(openFileID, firstSector + sector,
- 1, buffer);
- buffer += DEV_BYTES_PER_SECTOR;
- if (status != SUCCESS) {
- realStatus = status;
- }
- }
- } else {
- buffer += FS_BLOCK_SIZE;
- d276 1
- d278 1
- a278 1
- return(realStatus);
- @
-
-
- 1.1
- log
- @Initial revision
- @
- text
- @d18 1
- a18 1
- static char rcsid[] = "$Header: fsDiskUtils.c,v 1.4 87/06/02 11:20:32 nelson Exp $ SPRITE (Berkeley)";
- d179 54
- d237 2
- d240 4
- d261 1
- d285 15
- a299 1
- return(status);
- a300 1
- buffer += FS_BLOCK_SIZE;
- d302 1
- a302 1
- return(SUCCESS);
- @
-